当前位置: GO > golang中mysql连接池使用 性能结论

golang中mysql连接池使用 性能结论

2022-07-31 分类:GO 作者:admin 阅读(20)

在使用golang来处理数据库的时候,为了提升性能,往往都会使用连接池,有些人往往会自己实现一个连接池,用来互用mysql连接,但是如果你稍微细心一点, 就会发现内建的sql包已经实现了连接池。sql.Open函数实际上式返回一个连接池对象,而不是单个连接。

golang本身没有提供链接mysql的驱动,但是却定义了数据库的标准接口(内建的sql包), 第三方开发实现这些接口就完成了相应驱动的开发。第三方提供mysql的驱动比较多,遵循官方sql接口规范的也有好几个, 但是使用最广的,github上星最多应该是https://github.com/go-sql-driver/mysql
, 以下的所有操作都以该驱动进行演示。

1.数据库的基本操作

这里主要介绍数据库操作中一些常见操作,比如建表,以及数据的增删改查。

首先,我们需要创建一张表,用于存储数据, 我们可以通过db的Exec来执行SQL语句,比如下面是一个创建表的函数:

有了表过后,我们需要插入数据, 理论上可以将插入的SQL语句准备好, 填入Exec即可,但是sql已经对这种常用的场景抽象出了一个Prepare方法,Prepare方法将SQL的逻辑和数据剥离开来,通过占位符来生成一个SQL表达式(statement),然后表达式执行时,传入具体的需要插入的数据:

插入数据过会我们就可以,从中查询数据记录了,查询出来的数据以行为单位进行组织(Rows), Row包含字段和值,通过rows.Columns()获取字段,通过rows.Next()获取值,这里需要注意Next()这个方法,它和python里面的生成器概要很像,Next返回一个bool值,表示是否有新的row数据准备好了,如果准备好了,使用rows.Scan()来获取准备好的数据

这样扫描我们的确能获取到数据,但是数据并没有被友好的组织起来,在python的mysql驱动中提供一个简单方法可以将这些行数据组织成一个dict返回,因此在golang中,我们可以将rows的数据组织成一个map返回,方便使用。

接下来是数据的更新, 更新和数据的插入原理一致,只是在准备的SQL里面通过WHERE指定条件,以更新指定的数据记录。

最后是数据的删除,同理

2.如何设置连接池

数据库标准接口里面有3个方法用于设置连接池的属性: SetConnMaxLifetime, SetMaxIdleConns, SetMaxOpenConns

  • SetConnMaxLifetime: 设置一个连接的最长生命周期,因为数据库本身对连接有一个超时时间的设置,如果超时时间到了数据库会单方面断掉连接,此时再用连接池内的连接进行访问就会出错, 因此这个值往往要小于数据库本身的连接超时时间
  • SetMaxIdleConns: 连接池里面允许Idel的最大连接数, 这些Idel的连接 就是并发时可以同时获取的连接,也是用完后放回池里面的互用的连接, 从而提升性能。
  • SetMaxOpenConns: 设置最大打开的连接数,默认值为0表示不限制。控制应用于数据库建立连接的数量,避免过多连接压垮数据库。

代码上使用就很简单了, 初始化db时,根据需求设置好连接池。

3.性能对比

连接池对性能的提升还是很明显的, 下面我们就测试对比一下 使用连接池和不使用连接池时的性能差别。测试代码如下(不使用连接池时 注释掉连接池相关设置):

带连接池的测试结果:

去除连接池的设置后的测试结果:

4.结论

同样的并发情况下, 使用连接池比没使用快一倍, 在高并发的情况下,应该更明显。

一个debug教程:https://blog.csdn.net/qq_27696413/article/details/122165929

「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) 打赏

支付宝
微信
0

支付宝
微信
标签:

上一篇:

下一篇:

你可能感兴趣

共有 0 - golang中mysql连接池使用 性能结论

博客简介

精彩评论

  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    分别用不同厚度的筏板定义,画图后这设置筏板变截面处理。 http://f.fwxgx.co...

    评:新文章!
  • admin(6年前 (2020-03-09))

    新增一个框架图! http://biji.jinli.vip/wp-content/upl...

    评:新文章!
  • 一位WordPress评论者(6年前 (2020-02-13))

    嗨,这是一条评论。 要开始审核、编辑及删除评论,请访问仪表盘的“评论”页面。 评论者头像来自...

    评:世界,您好!